RSS 是 web2.0 的特徵之一,繼續將第3日的簡單Blog及第16日的單位用暫存系統加入這 RSS Feeds 的功能,而可以在連結網址上有:
並且產生 RSS 的內容:
如何在 Project 上加入 RSS Feeds ,就看要提供哪些內容的 RSS ,如果整個網站就只有一個 RSS 的話,可就直接在現有的 Controller 之加入下述的寫法;如果要針對不同類別,提供不同的 RSS 的話,也可另產生一個專門寫 RSS Feeds 的 Controller 裡。
參考 How To Generate RSS Feeds with Rails 的程式碼的作法,來寫在自己的 Project 上:
編輯 Controller
# 在 app/controllers/blog_controller.rb 是單純的,跟一般
def rss
@posts = Article.find(:all, :limit => 5, :order => "created_at DESC")
# 加這一行才不會把 app/views/layouts/blog.html.erb 加入 template 之中
render :layout => false
end
# 而在 app/controllers/upfile_controller.rb
# 因要判斷若是單位內 IP 範圍,則全部列出;單位外只列出只能單位下載的檔案,而會以下面的條件來顯示
def rss
myip = getip
if myip =~ /^1xx\.1xx\.|^192\.168\./
@posts = Upfile.find(:all, :order => 'created_at desc')
else
@posts = Upfile.find_all_by_target(2, :order => 'created_at desc')
end
render :layout => false
end
新增 views 中的 XML template
若依照 How To Generate RSS Feeds with Rails 範例中的 XML template 所產生的 RSS 是沒有文章的 URL hyperlink ,所以修改成:
# 編輯 app/views/blog/rss.rxml 如下的內容,而 upfile 的就參照再改成相對應的變數名稱即可。
xml.instruct! :xml, :version=>"1.0", :encoding=>"utf-8"
xml.rss(:version=>"2.0", "xmlns:atom" => "http://www.w3.org/2005/Atom"){
xml.channel{
xml.title("最簡單的 Blog")
xml.link("http://alpha.tagbible.net/")
xml.description("twtw 在鐵人賽測試用的")
xml.language "zh-TW"
xml.ttl "40"
xml.atom(:link, :href => "http://alpha.tagbible.net/blog/rss",
:rel => "self", :type => "application/rss+xml")
for post in @posts
xml.item do
xml.title(post.title)
xml.link(request.protocol + request.host_with_port +
url_for(:controller => "blog", :action => "show", :id => post))
xml.description(truncate(post.body))
xml.pubDate(post.created_at.strftime("%a, %d %b %Y %H:%M:%S %z"))
xml.guid(request.protocol + request.host_with_port +
url_for(:controller => "blog", :action => "show", :id => post))
end
end
}
}
上述一些語法,是透過 http://validator.w3.org/feed/ 測試幾次後修改的結果,也把建議加上 Missing atom:link with rel="self" 才獲得完全有效,又不會再建議要加什麼語法的 RSS 語法之確認。
接下來需要讓網址上可出現可訂閱 RSS 的連結:
# 在 app/views/layouts/blog.html.erb 加入:
<%= auto_discovery_link_tag(:rss, :action => 'rss') %>
# 而在 app/views/layouts/upfile.html.erb 加入:
<%= auto_discovery_link_tag(:rss, {:controller => 'upfile', :action => 'rss'}, {:title => '可下載檔案'}) %>
<%= auto_discovery_link_tag(:rss, {:controller => 'blog', :action => 'rss'}, {:title => '最簡單的Blog'}) %>
# 來測試看看在同一個頁面,提供不同 RSS 的訂閱連結
在暫存系統的網址上,設了兩個 RSS 的訂閱連結:
暫存系統的 RSS 內容:
製作簡單 Blog 聯播
RSS Feeds 是把資料轉成 XML 格式來供外界來讀取;而所謂的部落格聯播,則是將 RSS 的 XML 格式轉成網頁界面,在此以最簡單的方式呈獻。先安裝 simple-rss 的 gem 來作為解析 RSS 的 XML 格式之用
gem install simple-rss
# 編輯 app/controllers/demo_controller.rb
def blogrolls
# 定義要抓的 RSS 的網址
feeds = ['http://www.ithome.com.tw/plog/rss.php?blogId=1122&profile=rss20','http://slashdot.org/index.rdf']
@allrss = []
# 將各 site 抓下的 rss 內容,放到 @allrss 的陣列中,供 views 來作顯示的根據
feeds.each do |url|
onerss = fetch_rss(url)
@allrss << onerss
end
end
private
# 將 RSS 抓來的子程式
def fetch_rss(url)
require 'simple-rss'
require 'open-uri'
rss = SimpleRSS.parse open(url)
return rss
end
編輯 app/views/demo/blogrolls.html.erb
<% @allrss.each do |rss| -%>
<h2><%= link_to rss.title, rss.link -%></h2>
<ul>
<% rss.entries.each do |entry| -%>
<li><%= link_to entry.title, entry.link -%><br />
</li>
<% end -%>
</ul>
<% end -%>
網址連上 http://SITE/demo/blogrolls 就會如截圖所示:
簡單的 RSS 相關任務完成。